//路由管里:
//1. MaterialPageRoute:
// 继承⾃ PageRoute  类， PageRoute  类是⼀个抽象类，表示占有整个屏幕空间的⼀个模态路由⻚⾯，
//它还定义了路由构建及切换时过渡动画的相关接⼝及属性。 MaterialPageRoute  是Material组件库的⼀个Widget，它可
//以针对不同平台，实现与平台⻚⾯切换动画⻛格⼀致的路由切换动画：
//2. Navigator :
// 是⼀个路由管理的widget，它通过⼀个栈来管理⼀个路由widget集合。
// 通常当前屏幕显示的⻚⾯就是栈顶的路由。 提供了⼀系列⽅法来管理路由栈, 常用的就是push,pop
//3. 命名路由:
// 即给路由起⼀个名字，然后可以通过路由名字直接打开新的路由。这为路由管理带来了
//⼀种直观、简单的⽅式。但其有⼀个明显的缺点：不能直接传递路由参数(如下面的EchoRoute)。
//4. 路由表:
//要想使⽤命名路由，我们必须先提供并注册⼀个路由表（routing table），
// 这样应⽤程序才知道哪个名称与哪个路由Widget对应,路由表的定义如下：
//Map<String, WidgetBuilder> routes;


import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutterdemo/demos/demo_counter.dart';
import 'package:english_words/english_words.dart';

class DemoRoute extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'flutter dmeo',
      theme: ThemeData(primarySwatch: Colors.orange),
      home: MyHomePage(title: "app bar title"),
      //注册路由表
      routes: {
        "counter": (context) =>
        new DemoCounter(
          title: 'DemoCounter',
        ),
        "pgone": (context) => NewRoute(),
        "pgone222": (context) => NewRoute2(),
        "pgone333": (context) => EchoRoute("3333"),
        //命名路由参数传递, 内容固定,无法动态修改
        "pgone444": (context) =>
            EchoRoute(ModalRoute
                .of(context)
                .settings
                .arguments),
        //命名路由参数传递, 内容固定,无法动态修改
//        "/":(context) => MyHomePage(title: 'Flutter Demo Home Page'), //注册首页路由
        //我们只需在路由表中注册一下MyHomePage路由，然后将其名字作为MaterialApp的initialRoute属性值即可，该属性决定应用的初始路由页是哪一个命名路由。
      },
      //路由生成钩子
      //假设我们要开发一个电商APP，当用户没有登录时可以看店铺、商品等信息，但交易记录、购物车、用户个人信息等页面需要登录后才能看。为了实现上述功能，我们需要在打开每一个路由页前判断用户登录状态！如果每次打开路由前我们都需要去判断一下将会非常麻烦，那有什么更好的办法吗？答案是有！
      //MaterialApp有一个onGenerateRoute属性，它在打开命名路由时可能会被调用，之所以说可能，是因为当调用Navigator.pushNamed(...)打开命名路由时，如果指定的路由名在路由表中已注册，则会调用路由表中的builder函数来生成路由组件；如果路由表中没有注册，才会调用onGenerateRoute来生成路由。
      //onGenerateRoute只会对命名路由生效。
      onGenerateRoute: (RouteSettings settings) {
        return MaterialPageRoute(builder: (context) {
          String routeName = settings.name;
          //// 如果访问的路由页需要登录，但当前未登录，则直接返回登录页路由，
          // 引导用户登录；其它情况则正常打开路由。
        });
      },
    );
  }
}

class MyHomePage extends StatelessWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            FlatButton(
              child: Text("open new route"),
              textColor: Colors.blue,
              onPressed: () {
                Navigator.push(context,
                    new MaterialPageRoute(builder: (context) {
                      return new NewRoute();
                    }));
              },
            ),
            FlatButton(
              child: Text("open new route2222"),
              textColor: Colors.blue,
              onPressed: () {
                //通过路由名打开新路由页
                Navigator.pushNamed(context, "pgone222");
              },
            ),
            FlatButton(
              child: Text("open counter"),
              textColor: Colors.blue,
              onPressed: () {
                Navigator.pushNamed(context, "counter");
              },
            ),
            FlatButton(
              child: Text("open new route333"),
              textColor: Colors.blue,
              onPressed: () {
                Navigator.pushNamed(context, "pgone333");
              },
            ),
            FlatButton(
              child: Text("open new route444"),
              textColor: Colors.blue,
              onPressed: () {
                Navigator.pushNamed(context, "pgone444", arguments: "444");
              },
            ),
            FlatButton(
              child: Text("open new route555"),
              textColor: Colors.blue,
              onPressed: () {
                Navigator.push(context,
                    new MaterialPageRoute(builder: (context) {
                      return new EchoRoute("555");
                    }));
              },
            ),
            Image.asset("images/pic1.jpg"),
          ],
        ),
      ),
    );
  }
}

class NewRoute extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('new route'),
      ),
      body: new DecoratedBox(
          decoration: BoxDecoration(
            image: DecorationImage(image: AssetImage("images/pic2.jpg")),
          )),
    );
  }
}

class NewRoute2 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final wordPair = new WordPair.random();
    return Scaffold(
      appBar: AppBar(
        title: Text('new route222222'),
      ),
      body: Center(
        child: Text(wordPair.toString()),
      ),
    );
  }
}

class EchoRoute extends StatelessWidget {
  EchoRoute(this.tip);

  final String tip;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('echo route'),
      ),
      body: Center(
        child: Text(tip),
      ),
    );
  }
}
